#include "widget.h"
#include "ui_widget.h"

#include <QPushButton>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPushButton* CloseWidget = new QPushButton(this);
    QPushButton* ChangeTitle = new QPushButton(this);
    CloseWidget->setText("关闭");
    CloseWidget->move(600,500);

    ChangeTitle->setText("修改标题");
    ChangeTitle->move(300,200);

//    connect(CloseWidget,&QPushButton::clicked,this,&Widget::handleClose);
    connect(CloseWidget,&QPushButton::clicked,this,&Widget::close);

    connect(ChangeTitle,&QPushButton::clicked,this,&Widget::handleChangeTitle);

    //手动连接
//    connect(ui->uiChangeTitle,&QPushButton::clicked,this,&Widget::handleChangeTitle_ui);



    //以下功能：创建自定义信号，当函数运行时，触发
    //建立自定义信号的连接
    connect(this,&Widget::mySignals,this,&Widget::handleMySignal);

//    //建立连接不代表信号发出来了
//    //发送信号
//    emit mySignals();

    //以下功能：当点击按钮时，触发自定义信号
    //多连接一个按钮
    connect(ui->mySignalButton,&QPushButton::clicked,this,&Widget::handleMySignalButton);





    //信号和槽的多对多
    connect(this, &Widget::mySignal1, this, &Widget::mySlot1);
    connect(this, &Widget::mySignal1, this, &Widget::mySlot2);
    connect(this, &Widget::mySignal2, this, &Widget::mySlot1);
    connect(this, &Widget::mySignal2, this, &Widget::mySlot3);


    //断开连接
    //断开关闭按钮的连接
    disconnect(CloseWidget, &QPushButton::clicked, this, &Widget::handleClose);



    //lambda
    QPushButton* lambda = new QPushButton(this);
    lambda->setText("lambda 按钮");
    lambda->move(200,500);
    connect(lambda, &QPushButton::clicked, this, [&](){
        qDebug()<<"lambda 被执行了";

        //lambda是一个回调函数，无法获取到上层作用域中的变量，可以通过在[]中传参解决
        //[lambda, this]：传入lambda和this
        //[=]：上层所有传参
        //[&]：上层所有传引用
        lambda->move(300,500);
    });

}

Widget::~Widget()
{
    delete ui;
}

void Widget::handleClose()
{
    close();
}

void Widget::handleChangeTitle()
{
    this->setWindowTitle("代码按钮被按下，标题已被修改！");
}

void Widget::handleChangeTitle_ui()
{
    this->setWindowTitle("ui按钮被按下，标题已被修改！");
}

void Widget::handleMySignalButton()
{
    //emit mySignals();
    mySignals("带参数的信号","");
}


void Widget::on_uiChangeTitle_clicked()
{
    //通过函数名自动connect -- QMetaObject::connectSlotByName()
    //on：objectName     clicked：信号
    this->setWindowTitle("ui自动connect按钮已被按下");
}

void Widget::handleMySignal(const QString& str)
{
    this->setWindowTitle(str+" 处理自定义信号");
}

void Widget::mySlot1()
{
    qDebug() << "mySlot1";
}

void Widget::mySlot2()
{
    qDebug() << "mySlot2";
}

void Widget::mySlot3()
{
    qDebug() << "mySlot3";
}
